package ar.com.ctrln.view.dashboard.mantenimiento.ticket;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.DropEvent;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.event.ForwardEvent;
import org.zkoss.zk.ui.ext.Scope;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Div;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Popup;
import org.zkoss.zul.Row;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Timebox;
import org.zkoss.zul.Timer;
import org.zkoss.zul.Toolbarbutton;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.compras.RegistrarPedidoCompra;
import ar.com.ctrln.control.mantenimiento.ticket.ModificarActividad;
import ar.com.ctrln.control.mantenimiento.ticket.RegistrarActividad;
import ar.com.ctrln.control.mantenimiento.ticket.RegistrarTicket;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.compra.PedidoCompra;
import ar.com.ctrln.persistence.model.insumo.Insumo;
import ar.com.ctrln.persistence.model.servicios.Servicio;
import ar.com.ctrln.persistence.model.servicios.TipoServicio;
import ar.com.ctrln.persistence.model.ticket.EstadoTicket;
import ar.com.ctrln.persistence.model.ticket.Ticket;
import ar.com.ctrln.persistence.model.ticket.TipoTicket;
import ar.com.ctrln.persistence.model.ticket.actividad.Actividad;
import ar.com.ctrln.persistence.model.ticket.actividad.DetalleActividad;
import ar.com.ctrln.persistence.model.vehiculo.Vehiculo;
import ar.com.ctrln.view.render.mantenimiento.actividad.DetActividadItemRender;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@SuppressWarnings("unused")
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class EditarActividadController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = 7293861791737040132L;

	@WireVariable
	private ModificarActividad modificarActividad;
	
	@WireVariable
	private RegistrarPedidoCompra registrarPedidoCompra;

	private Ticket ticket;

	private Insumo insumo;

	private Actividad activ;
	
	private List<PedidoCompra> listaPedidos;
	
	private Set<DetalleActividad> listaDetAct;

	private DetalleActividad detalle;

	private Cliente emisor;

	boolean flagElimino = false;

	@SuppressWarnings("rawtypes")
	private EventQueue eqB = (EventQueue) EventQueues.lookup("cantInsumos",
			EventQueues.DESKTOP, true);
	@SuppressWarnings("rawtypes")
	private EventQueue eqB1 = (EventQueue) EventQueues.lookup(
			"descontarInsumos", EventQueues.DESKTOP, true);
	@SuppressWarnings("rawtypes")
	private EventQueue eqB2 = (EventQueue) EventQueues.lookup(
			"devolverInsumos", EventQueues.DESKTOP, true);
	@SuppressWarnings("rawtypes")
	private EventQueue eqB3 = (EventQueue) EventQueues.lookup("closeInsumos",
			EventQueues.DESKTOP, true);
	@SuppressWarnings("rawtypes")
	private EventQueue act2 = (EventQueue) EventQueues.lookup("actulizarLista",
			EventQueues.DESKTOP, true);

	@Wire
	private Window wEditarActividad;

	@Wire
	private Div btnCancelarActividad;

	@Wire
	private Timebox tbInicio;

	@Wire
	private Timebox tbFin;

	@Wire
	private Datebox dbFechaIni;

	@Wire
	private Datebox dbFechaFin;

	@Wire
	private Checkbox chkVehiculo;

	@Wire
	private Row rowVehiculo;

	@Wire
	private Textbox tbNroTicket;

	@Wire
	private Textbox tbNombreAct;

	@Wire
	private Label lGuardarModificar;

	@Wire
	private Listbox lbDetActividades;

	@Wire
	private Textbox tbDescripcion;

	@Wire
	private Combobox cboVehiculo;

	@Wire
	private Row estadoAct;

	@Wire
	private Popup popupExito;

	@Wire
	private Popup popup;

	@Wire
	private Label popText;

	@Wire
	private Label lEstadoActividad;

	@Wire
	private Timer timer;

	private Toolkit toolkit;

	private Dimension scrnsize;

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		SimpleDateFormat format = new SimpleDateFormat("HH:mm");
		listaPedidos=new ArrayList<PedidoCompra>();

		eqB.subscribe(new EventListener<Event>() {
			public void onEvent(Event event) throws Exception {
				boolean existeIns = false;
				detalle = new DetalleActividad(insumo, (Integer) event
						.getData());
				if ((Integer) event.getData() > insumo.getStock()) {
					PedidoCompra pedido= new PedidoCompra();
					pedido.setInsumo(insumo);
					pedido.setCantidad((Integer) event.getData()-insumo.getStock());
					boolean isPedido=false;
					for(PedidoCompra nota : listaPedidos){
						if(nota.getInsumo()==pedido.getInsumo()){
							nota.setCantidad(nota.getCantidad()+(Integer) event.getData());
							isPedido=true;
						}
					}
					if(!isPedido)listaPedidos.add(pedido);
					
					
					for (DetalleActividad det : listaDetAct) {
						if (det.getInsumo().getNombre() == insumo.getNombre()) {
							det.setCantidad(det.getCantidad()
									+ (Integer) event.getData());
							existeIns = true;
						}
					}
					if (!existeIns) {
						listaDetAct.add(detalle);
						existeIns = false;
					}
					lbDetActividades
							.setModel(new ListModelList<DetalleActividad>(
									listaDetAct));

					eqB1.publish(new Event("onButtonClick", null, detalle));
				} else {
					Clients.showNotification(
							"La cantidad debe ser inferior al stock disponible",
							Clients.NOTIFICATION_TYPE_WARNING, null,
							"middle_center", 3500);
				}
				insumo = null;
				detalle = null;
			}

		});
		long idActividad = (Long) Executions.getCurrent().getArg()
				.get("actividadID");
		activ = modificarActividad.getActividadxId(idActividad);
		if (activ.getEstado().equals("Finalizada")
				|| activ.getEstado().equals("Cancelada"))
			estadoAct.setVisible(false);

		long idTicket = (Long) Executions.getCurrent().getArg().get("ticketID");
		ticket = modificarActividad.getTicketxId(idTicket);

		tbNombreAct.setValue(activ.getNombre());
		tbDescripcion.setValue(activ.getDescripcion());
		dbFechaIni.setValue(activ.getFechaInicio());
		if (activ.getHoraInicio() != null)
			tbInicio.setValue(format.parse(activ.getHoraInicio()));
		dbFechaFin.setValue(activ.getFechaFin());
		if (activ.getHoraFin() != null)
			tbFin.setValue(format.parse(activ.getHoraFin()));
		if (activ.getVehiculo() != null) {
			chkVehiculo.setChecked(true);
			rowVehiculo.setVisible(true);
		}
		tbNroTicket.setValue(String.valueOf(activ.getTicket().getId()));
		lbDetActividades.setItemRenderer(new DetActividadItemRender());
		if (activ.getDetalles() != null) {
			listaDetAct = activ.getDetalles();
		} else {
			listaDetAct = new HashSet();
		}
		lbDetActividades.setModel(new ListModelList<DetalleActividad>(
				listaDetAct));
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Listen("onCreate = #wEditarActividad")
	public void asignarCombo() {
		cboVehiculo.addEventListener("onInitRenderLater", new EventListener() {
			public void onEvent(Event event) throws Exception {
				if (activ.getVehiculo() != null)
					cboVehiculo.setSelectedIndex((int) (activ.getVehiculo()
							.getId() - 1));
			}
		});
		cboVehiculo.setModel(new ListModelList<Vehiculo>(modificarActividad
				.listaVehiculo()));
	}

	@SuppressWarnings("unchecked")
	@Listen("onClick = #btnRegistrarActividad")
	public void registrarActividad() {

		activ.setDescripcion(tbDescripcion.getText());
		if (!activ.getEstado().equals(Actividad.ESTADO_FINALIZADA))
			activ.setEstado(Actividad.ESTADO_CREADA);

		activ.setFechaInicio(dbFechaIni.getValue());
		activ.setFechaFin(dbFechaFin.getValue());
		activ.setHoraInicio(tbInicio.getText());
		activ.setHoraFin(tbFin.getText());
		activ.setNombre(tbNombreAct.getText());
		activ.setTicket(ticket);
		if (chkVehiculo.isChecked() && cboVehiculo.getSelectedIndex() != -1)
			activ.setVehiculo((Vehiculo) cboVehiculo.getModel().getElementAt(
					cboVehiculo.getSelectedIndex()));
		if (activ.getDetalles() != null) {
			activ.getDetalles().addAll(listaDetAct);
		} else {
			activ.setDetalles(listaDetAct);
		}
		modificarActividad.actualizarActividad(activ);
		for(PedidoCompra ped : listaPedidos){
			ped.setFechaAlta(new Date());
			ped.setFechaPref(dbFechaIni.getValue());
			ped.setEstado(PedidoCompra.ESTADO_PENDIENTE);
			registrarPedidoCompra.guardarPedido(ped);
		}
		act2.publish(new Event("onButtonClick", null, null));
		salirActividad();
		Clients.showNotification("La Actividad se modificacion con exito!",
				Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 2500);
		popup.close();

	}

	@Listen("onClick = #chkVehiculo")
	public void mostrarVehiculo() {
		if (chkVehiculo.isChecked())
			rowVehiculo.setVisible(true);
		else
			rowVehiculo.setVisible(false);
	}

	@Listen("onClick = #iAgregarDetalle")
	public void agregarDetalle() {
		Component window = Executions.createComponents(
				"/zul/mantenimiento/tickets/registrarDetalleActividad.zul",
				wEditarActividad, null);
	}

	@SuppressWarnings("unchecked")
	@Listen("onClick = #iEliminarDetalle")
	public void borrarDetalle() {
		eqB2.publish(new Event("onButtonClick", null,
				(DetalleActividad) lbDetActividades.getSelectedItem()
						.getValue()));
		listaDetAct.remove(lbDetActividades.getSelectedItem().getValue());
		lbDetActividades.setModel(new ListModelList<DetalleActividad>(
				listaDetAct));
		boolean flagElimino = true;
	}

	@Listen("onChange = #dbFechaIni")
	public void checkFechaInicio() {
		checkFecha();
	}

	@Listen("onChange = #dbFechaFin")
	public void checkFechafin() {
		checkFecha();
	}

	@Listen("onDrop = #lbDetActividades")
	public void move(DropEvent event) {
		Listitem draggedListitem = (Listitem) event.getDragged();
		insumo = (Insumo) draggedListitem.getAttribute("data");
		Executions.createComponents(
				"/zul/mantenimiento/tickets/cantDetalleInsumo.zul",
				wEditarActividad, null);
	}

	public void checkFecha() {
		Long inicio = ((Date) dbFechaIni.getValue()).getTime();
		Long fin = ((Date) dbFechaFin.getValue()).getTime();
		if (inicio > fin) {
			Clients.showNotification(
					"La fecha de finalizacion debe ser mayor a la de inicio",
					Clients.NOTIFICATION_TYPE_WARNING, null, "middle_center",
					3500);
			dbFechaFin.setValue(dbFechaIni.getValue());
		}
	}

	@Listen("onClick = #btnFinActividad")
	public void finalizarActividad() {
		activ.setEstado(Actividad.ESTADO_FINALIZADA);
		activ.setFechaFinReal(new Date());
		for (DetalleActividad d : activ.getDetalles()) {
			Insumo i = d.getInsumo();
			i.setStock(i.getStock() - d.getCantidad());
			modificarActividad.actualizarInsumo(i);
		}
		lEstadoActividad.setValue("La Actividad esta finalizada!");
	}

	@SuppressWarnings("unchecked")
	@Listen("onClick = #btnCancelarActividad")
	public void salirActividad() {
		eqB.close();
		listaDetAct.clear();
		activ = null;
		eqB3.publish(new Event("onButtonClick", null, null));
		Executions.getCurrent().getSession().setAttribute("ListaActual", null);
		act2.publish(new Event("onButtonClick", null, null));
		wEditarActividad.onClose();
	}

	@SuppressWarnings("unchecked")
	@Listen("onClose = #wEditarActividad")
	public void cerrarVentana() {
		eqB.close();
		listaDetAct.clear();
		activ = null;
		eqB3.publish(new Event("onButtonClick", null, null));
		Executions.getCurrent().getSession().setAttribute("ListaActual", null);
		act2.publish(new Event("onButtonClick", null, null));
		wEditarActividad.onClose();
	}

}
